import numpy as np
import torchvision.transforms as transforms
from PIL import Image

# 加载图像并转换为NumPy数组
image = Image.open('path_to_image.jpg')
image_np = np.array(image)

# 手动进行归一化
image_normalized = image_np / 255.0

# 转换为PyTorch张量
transform = transforms.Compose([transforms.ToTensor()])
image_tensor = transform(image)

print("Manually normalized image:", image_normalized)
print("Transformed image tensor:", image_tensor)

# 将像素值从[0, 255]
# 范围缩放到[0, 1]
# 范围的过程称为归一化（Normalization）。这种操作在图像处理和深度学习中非常常见，主要有以下几个作用：
#
# 作用
# 加速收敛：
#
# 在训练神经网络时，如果输入数据的数值范围较大，梯度下降算法的收敛速度可能会变慢。通过将像素值缩放到[0, 1]
# 范围，可以使得梯度更新更加稳定，从而加速模型的收敛。
# 提高数值稳定性：
#
# 较大的数值范围可能会导致计算过程中出现数值不稳定的问题，例如溢出或下溢。将数据缩放到较小的范围可以减少这些问题，从而提高数值计算的稳定性。
# 统一数据分布：
#
# 不同图像的数据分布可能有所不同，通过归一化可以将它们统一到一个标准范围内，使得模型更容易学习到通用的特征。
# 适应激活函数：
#
# 许多激活函数（如Sigmoid、Tanh）在输入值较大或较小时会饱和，导致梯度消失问题。归一化后的数据更符合这些激活函数的输入要求，有助于避免梯度消失问题。
# 具体实现
# 假设我们有一个像素值为
# x
# 的图像，其原始范围是[0, 255]。要将这个值缩放到[0, 1]
# 范围，可以使用以下公式：
#
# x_normalized = (x - min) / (max -min)
# 其中：
# • min 是原始数据的最小值，对于8位图像通常是0。
# • max 是原始数据的最大值，对于8位图像通常是255。
# 因此，对于每个像素值 x，归一化后的值为：
# x_normalized = x / 255